package com.xbongbong.saas.enums;

import com.xbongbong.saas.enums.business.AssembleEnum;
import com.xbongbong.saas.enums.business.BomBillEnum;
import com.xbongbong.saas.enums.business.ContractEnum;
import com.xbongbong.saas.enums.business.InstockEnum;
import com.xbongbong.saas.enums.business.InventoryEnum;
import com.xbongbong.saas.enums.business.OriStockEnum;
import com.xbongbong.saas.enums.business.OutstockEnum;
import com.xbongbong.saas.enums.business.ProductionOrderEnum;
import com.xbongbong.saas.enums.business.PurchaseEnum;
import com.xbongbong.saas.enums.business.QuotationEnum;
import com.xbongbong.saas.enums.business.RefundEnum;
import com.xbongbong.saas.enums.business.SalesOpportunityEnum;
import com.xbongbong.saas.enums.business.TransferEnum;
import com.xbongbong.saas.enums.business.WorkOrderEnum;
import lombok.Getter;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Objects;

/**
 * 导入时模板显示的关联产品字段
 *
 * @author GuoJun.HU
 * @date 2019/4/24 17:01
 * @since V1.0
 */
@Getter
public enum ImportRelativeProductEnum {

    // 关联产品字段
    IMPORT_CONTRACT_PRODUCT(XbbRefTypeEnum.CONTRACT.getCode(), ContractEnum.PRODUCT.getAttr(),
            Arrays.asList(RelativeProductEnum.NAME, RelativeProductEnum.PRODUCT_NO, RelativeProductEnum.SPECIFICATION,
                    RelativeProductEnum.SALE_PRODUCT_PRICE, RelativeProductEnum.SALE_DISCOUNT, RelativeProductEnum.NUM, RelativeProductEnum.MEMO)),
    IMPORT_OPPORTUNITY_PRODUCT(XbbRefTypeEnum.SALES_OPPORTUNITY.getCode(), SalesOpportunityEnum.PRODUCTS.getAttr(),
            Arrays.asList(RelativeProductEnum.NAME, RelativeProductEnum.PRODUCT_NO, RelativeProductEnum.SPECIFICATION,
                    RelativeProductEnum.SALE_PRODUCT_PRICE, RelativeProductEnum.SALE_DISCOUNT, RelativeProductEnum.NUM)),
    IMPORT_BOM_PRODUCT(XbbRefTypeEnum.BOM_BILL.getCode(), BomBillEnum.PRODUCT.getAttr(),
            Arrays.asList(RelativeProductEnum.NAME, RelativeProductEnum.PRODUCT_NO, RelativeProductEnum.SPECIFICATION)),
    IMPORT_BOM_MATERIEL(XbbRefTypeEnum.BOM_BILL.getCode(), BomBillEnum.MATERIEL.getAttr(),
            Arrays.asList(RelativeProductEnum.NAME, RelativeProductEnum.PRODUCT_NO, RelativeProductEnum.SPECIFICATION, RelativeProductEnum.NUM, RelativeProductEnum.ATTRITION_RATE)),
    IMPORT_PRODUCTION_ORDER_PRODUCT(XbbRefTypeEnum.PRODUCTION_ORDER.getCode(), ProductionOrderEnum.PRODUCT.getAttr(),
            Arrays.asList(RelativeProductEnum.NAME, RelativeProductEnum.PRODUCT_NO, RelativeProductEnum.SPECIFICATION, RelativeProductEnum.NUM)),
    IMPORT_PRODUCTION_ORDER_MATERIEL(XbbRefTypeEnum.PRODUCTION_ORDER.getCode(), ProductionOrderEnum.MATERIEL.getAttr(),
            Arrays.asList(RelativeProductEnum.NAME, RelativeProductEnum.PRODUCT_NO, RelativeProductEnum.SPECIFICATION, RelativeProductEnum.WAREHOUSE, RelativeProductEnum.NUM)),
    IMPORT_INSTOCK_PRODUCT(XbbRefTypeEnum.INSTOCK.getCode(), InstockEnum.PRODUCT.getAttr(),
            Arrays.asList(RelativeProductEnum.NAME, RelativeProductEnum.PRODUCT_NO, RelativeProductEnum.SPECIFICATION, RelativeProductEnum.NUM, RelativeProductEnum.COST, /*RelativeProductEnum.SALE_SUBTOTAL,*/ RelativeProductEnum.WAREHOUSE)),
    IMPORT_OUTSTOCK_PRODUCT(XbbRefTypeEnum.OUTSTOCK.getCode(), OutstockEnum.PRODUCT.getAttr(),
            Arrays.asList(RelativeProductEnum.NAME, RelativeProductEnum.PRODUCT_NO, RelativeProductEnum.SPECIFICATION, RelativeProductEnum.NUM, /*RelativeProductEnum.SALE_SUBTOTAL,*/ RelativeProductEnum.WAREHOUSE)),
    IMPORT_ASSEMBLE_IN_PRODUCT(XbbRefTypeEnum.ASSEMBLE.getCode(), AssembleEnum.IN_PRODUCTS.getAttr(),
            Arrays.asList(RelativeProductEnum.NAME, RelativeProductEnum.PRODUCT_NO, RelativeProductEnum.SPECIFICATION, RelativeProductEnum.NUM, RelativeProductEnum.COST, RelativeProductEnum.WAREHOUSE)),
    IMPORT_ASSEMBLE_OUT_PRODUCT(XbbRefTypeEnum.ASSEMBLE.getCode(), AssembleEnum.OUT_PRODUCTS.getAttr(),
            Arrays.asList(RelativeProductEnum.NAME, RelativeProductEnum.PRODUCT_NO, RelativeProductEnum.SPECIFICATION, RelativeProductEnum.NUM, RelativeProductEnum.WAREHOUSE)),
    IMPORT_TRANSFER_PRODUCT(XbbRefTypeEnum.TRANSFER.getCode(), TransferEnum.PRODUCTS.getAttr(),
            Arrays.asList(RelativeProductEnum.NAME, RelativeProductEnum.PRODUCT_NO, RelativeProductEnum.SPECIFICATION, RelativeProductEnum.NUM)),
    IMPORT_INVENTORY_PRODUCT(XbbRefTypeEnum.INVENTORY.getCode(), InventoryEnum.PRODUCT.getAttr(),
            Arrays.asList(RelativeProductEnum.NAME, RelativeProductEnum.PRODUCT_NO, RelativeProductEnum.SPECIFICATION, RelativeProductEnum.NUM)),
    IMPORT_RETURNED_PURCHASE_PRODUCT(XbbRefTypeEnum.RETURNED_PURCHASE.getCode(), InventoryEnum.PRODUCT.getAttr(),
            Arrays.asList(RelativeProductEnum.NAME, RelativeProductEnum.PRODUCT_NO, RelativeProductEnum.SPECIFICATION, RelativeProductEnum.NUM, RelativeProductEnum.MEMO)),
    IMPORT_PURCHASE_PRODUCT(XbbRefTypeEnum.PURCHASE.getCode(), PurchaseEnum.PRODUCT.getAttr(),
            Arrays.asList(RelativeProductEnum.NAME, RelativeProductEnum.PRODUCT_NO, RelativeProductEnum.SPECIFICATION, RelativeProductEnum.NUM, RelativeProductEnum.PRODUCT_PRICE, RelativeProductEnum.MEMO)),
    IMPORT_REFUND_PRODUCT(XbbRefTypeEnum.REFUND.getCode(), RefundEnum.PRODUCTS.getAttr(),
            Arrays.asList(RelativeProductEnum.NAME, RelativeProductEnum.PRODUCT_NO, RelativeProductEnum.SPECIFICATION, RelativeProductEnum.NUM, RelativeProductEnum.MEMO)),
    IMPORT_WORK_ORDER_PRODUCT(XbbRefTypeEnum.WORK_ORDER.getCode(), WorkOrderEnum.SPARE_PARTS.getAttr(),
            Arrays.asList(RelativeProductEnum.NAME, RelativeProductEnum.PRODUCT_NO, RelativeProductEnum.SPECIFICATION, RelativeProductEnum.NUM)),
    IMPORT_QUOTATION_PRODUCT(XbbRefTypeEnum.QUOTATION.getCode(), QuotationEnum.PRODUCT.getAttr(), Arrays.asList(RelativeProductEnum.NAME, RelativeProductEnum.PRODUCT_NO, RelativeProductEnum.SPECIFICATION, RelativeProductEnum.SALE_PRODUCT_PRICE, RelativeProductEnum.SALE_DISCOUNT, RelativeProductEnum.NUM, RelativeProductEnum.MEMO)),
    IMPORT_ORI_STOCK_PRODUCT(XbbRefTypeEnum.ORI_STOCK.getCode(), OriStockEnum.PRODUCT_DETAIL.getAttr(),
            Arrays.asList(RelativeProductEnum.NAME, RelativeProductEnum.BARCODE, RelativeProductEnum.SPECIFICATION, RelativeProductEnum.NUM, RelativeProductEnum.MEMO)),
    ;

    private int businessType;
    private String attr;
    private List<RelativeProductEnum> productAttrList;

    ImportRelativeProductEnum(int businessType, String attr, List<RelativeProductEnum> productAttrList) {
        this.businessType = businessType;
        this.attr = attr;
        this.productAttrList = productAttrList;
    }

    /**
     * 获取全部枚举
     */
    public static List<ImportRelativeProductEnum> getAllEnum() {
        return new ArrayList<>(Arrays.asList(values()));
    }

    /**
     * 根据businessType和attr获取枚举
     */
    public static ImportRelativeProductEnum getByCode(int businessType, String attr) {
        for (ImportRelativeProductEnum cache : values()) {
            if (Objects.equals(businessType, cache.getBusinessType()) && Objects.equals(cache.getAttr(), attr)) {
                return cache;
            }
        }
        return null;
    }
}
